All possible ways to interleave two strings
Haskell, 53 48 bytes

a%&quot;&quot;=[a]
a%b=[x:t|(x:y,z)&lt;-[(a,b),(b,a)],t&lt;-y%z]

Defines a function % for which a%b with strings a,b gives a list of strings.
Given two strings, we choose one of the two to take the first character from. We then recurse on the remainder of two strings, prepending that character to each result.
When one of the string is empty, the only possible result is the other string. &quot;&quot;%&quot;&quot;=[&quot;&quot;] would also suffice, but's it's longer.

53 bytes:
a@(b:c)%d@(e:f)=((b:)&lt;$&gt;c%d)++((e:)&lt;$&gt;a%f)
a%d=[a++d]

Defines a function % for which a%d with strings a,d gives a list of strings.
The function is defined recursively. If we take a character from the first string, then it must be prepended to each result of the recursive call on the remained of the first string with the second string. Symmetrically for the other string.
For the base case, if one of the strings is empty, the result is a single-element list of their concatenation. This is shorter than two cases for each string being empty.