My solution:
module Lib
( shortestLongest
) where
import Data.Foldable (foldr, foldr1)
shortestLongest :: [[[a]]] -> [[a]]
shortestLongest = panic . foldr1 donow . map (foldr1 dol8r . map defer)
-- | Wrap a `Now` value in zero or more `L8r` constructors.
data Procrastinate b = Now b | L8r (Procrastinate b)
-- | Defer list of length @n@ in @n@ layers of `L8r`.
defer :: [a] -> Procrastinate [[a]]
defer = foldr (const L8r) <$> Now . (:[]) <*> id
-- | Time's up, got to do it now.
panic :: Procrastinate a -> a
panic (L8r a) = panic a
panic (Now a) = a
-- | Prefer later
dol8r :: Procrastinate [a] -> Procrastinate [a] -> Procrastinate [a]
dol8r (L8r a) (L8r b) = L8r $ dol8r a b
dol8r (Now _) b@(L8r _) = b
dol8r a@(L8r _) (Now _) = a
dol8r (Now a) (Now b) = Now $ a <> b
-- | Prefer sooner
donow :: Procrastinate [a] -> Procrastinate [a] -> Procrastinate [a]
donow (L8r a) (L8r b) = L8r $ donow a b
donow a@(Now _) (L8r _) = a
donow (L8r _) b@(Now _) = b
donow (Now a) (Now b) = Now $ a <> b