What's the correct approach to upgrade a contract using ERC7201

Your question is incomplete, since there are no state (storage) variables in the given code.

There is only a type (struct) definition.

Hence the answer depends on where exactly a state variable of that type is allocated in the contract.

For example, in this contract, it is safe to extend the MainStorage struct:

contract ExampleV2 is UUPSUpgradeable, Initializable {
    uint256 private a;
    uint256 private b;
    MainStorage private c;
}

While in this contract, it is not safe to extend the MainStorage struct:

contract ExampleV2 is UUPSUpgradeable, Initializable {
    uint256 private a;
    MainStorage private b;
    uint256 private c;
}