I like the consideration mentioned in the other answers when thinking of [[a]] as a matrix. But I do object slightly on the grounds that not all [[a]] really are matrices; it is quite often useful to have "jagged" nested lists, and transpose can still be sensible and useful on them. So I'd like to give some arguments that do not assume rectangular-ness. I have two.
First, suppose we lived in an alternative universe where transpose [[]] = [[]]. Now, what should transpose [[], []] do? There's not really a good way to reflect in the output that there were two empty lists in the input. So let's try choosing transpose [[], []] = [[]] again. But now we have an alternative broken pattern:
> transpose [[], [], []]
[[]]
> transpose [[], []]
[[]]
> transpose [[]]
[[]]
> transpose []
[] -- whoops, not [[]] like the pattern would suggest
If we make all the changes described above and change to transpose [] = [[]] so that this pattern works, then your original pattern is broken again.
> transpose [[[[]]]]
[[[[]]]]
> transpose [[[]]]
[[[]]]
> transpose [[]]
[[]]
> transpose []
[[]] -- whoops, not [] like the pattern would suggest
It seems it's just not possible to have a definition of transpose that makes all the patterns you might wish for work out.
Second, the current definition of transpose does have some nice algebraic properties. One such is this:
length' (transpose xs) = foldMap length' xs
Here length' is just like length, but returns an unsigned number whose Monoid instance uses mappend = max; mempty = 0. This property forces transpose [[]] = [], because
length' (transpose [[]]) = foldMap length' [[]]
= fold [length' []]
= fold [0]
= 0
and the only way to get length' foo = 0 is foo = [].
(This second argument is very, very similar to the one given in the other answers, though it's stated in very different language!)
sequenceA @[] @ZipList [ZipList []]gives you, modulo newtypes.baseis full of partial functions that are far less elegant than this.