Yes, that’s the difference between a Python list and an nn.ModuleList.
As explained in the linked topics, the parameters wrapped in a plain list won’t be registered, while the parameters from all modules inside an nn.ModuleList will be registered.
So if you want to use a list-like container, then the answer to the initial question is: yes, it’s mandatory to use nn.ModuleList instead of list to register all parameters.
If you don’t need a list-like container and just want to register parameters or layers inside an nn.Module class, then you can just use the assignment.