Could you try to use nn.ModuleList instead of Python lists to store your layers?
This will make sure all parameters are returned when calling model.parameters() and passing them to the optimizer.
However, this would not explain the gradients to be all zero, but might be a starter in debugging this issue.