The items in your do-block must be in the same monad as you're operating in - in this example - the list monad:
main = do
x <- return $ do
[ 1 ]
[ 2 ]
[ 3 ]
print (x :: [Int])
Unfortunately, there is no accumulation of items. You can reason this out if you desugar the do-notation into binds:
[ 1 ] >> [ 2 ] >> [ 3 ]
[ 1 ] >>= (\x -> [ 2 ] >>= (\y -> [ 3 ]))
and then examine the list Monad instance.
You can achieve something similar to what you're looking for with the writer monad:
import Control.Monad.Writer.Lazy
main = do
x <- return $ execWriter $ do
tell [1]
tell [2]
tell [3]
print (x :: [Int])