Here's one way.
foo :: Int -> [t] -> [[t]]
foo k xs | k > 0 = foldr cons [] .
zip xs . cycle $ (False <$ [2..k]) ++ [True]
where
cons (a,True) ys = [a] : ys
cons (a,False) ys = (a:x) : zs
where
(x,zs) | null ys = ([], [])
| otherwise = (head ys, tail ys)
-- > foo 3 [1..10]
-- => [[1,2,3],[4,5,6],[7,8,9],[10]]
-- > take 4 . foo 3 $ [1..]
-- => [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
-- > take 3 . map (take 2) . foo 3 $ [1..8] ++ undefined
-- => [[1,2],[4,5],[7,8]]
It creates the output as you have described it, and does so in a lazy enough way so that it works with infinite lists as well.
(edit: made it even lazier so that the last example would work, based off the idea by Daniel Fischer)