Cases variations of a string
JavaScript (Firefox 30-57), 75 bytes

f=([c,...s])=&gt;c?[for(t of s[0]?f(s):[''])for(d of c+c.toUpperCase())d+t]:[]


67 bytes if the empty string returns [""]:

f=([c,...s])=&gt;c?[for(t of f(s))for(d of c+c.toUpperCase())d+t]:['']