The Problem
In Unity's Docs :
- [Serialize] Referenced values cannot be shared between UnityEngine.Object instances. For example, two MonoBehaviours cannot share an object that is serialized by reference. Use ScriptableObjects instead to share data.
As Instantiate creates a new Unity Object, its data cannot be shared by reference by just decorating the fields with a [SerializeReference] Attributes.
The Solution
Instead, each member of the list that you want to be copied by reference during instantiation must be it's own Unity Asset. This means each member has to be inherit from UnityEngine.Object and be an actual Asset on disk with a .meta file with a GUID. It's these GUIDs which are the links which Unity's serialization system uses to stitch all the references back together at edit or runtime.
You can create an Unity asset via script by going AssetDatabase.CreateAsset([...]) with anything which inherits from UnityEngine.Object. But instead what you probably want to do for convenient sake is inherit from ScriptableObject and then create your assets via the asset menu (which you can open by right clicking in the project window). This way you can create new assets in the editor and don't have to create custom inspectors to edit their values.
Here are the two scripts which get the job done:
[CreateAssetMenu(menuName = "Custom/test so", order = 0)]
public class MySO : ScriptableObject
{
public int Value;
}
And:
public class Test : MonoBehaviour
{
public List<MySO> scriptableObjectAssets;
}
Opening the asset menue to create the scriptableObject:

The inspector for the the Monobehavior with the members which will be copied by reference during instantiations:
