Interesting, the almost identical code worked for me:
>>> class Model(nn.Module):
...     def __init__(self, size):
...         super(Model, self).__init__()
...         self.znoise = torch.FloatTensor(1, size, 1)
...         if torch.cuda.is_available():
...             self.znoise = self.znoise.cuda()
...         self.encoder = nn.ModuleList([nn.Linear(3,4)])
...
>>> m = Model(2)
>>> m.encoder
ModuleList (
  (0): Linear (3 -> 4)
)
>>> nn.DataParallel(m).module.encoder
ModuleList (
  (0): Linear (3 -> 4)
)
>>>

What is @model_ingredient.capture? Is it doing some magic? Could you remove it and try again?