Our understanding was that this had the affect of disabling AOT compilation
No, that is not what it does. It simply allows app to use an interpreter, for some bits of code that don't successfully AOT compile. Without this, MSBuild attempts to AOT compile everything. Your code, system code, third party libraries.
Short explanation:
With setting <UseInterpreter>True</UseInterpreter>, AOT compilation is still done wherever possible. App developer does not need to determine which modules should be excluded.
Details:
The Mono interpreter overcomes these restrictions while abiding by platform restrictions. It enables you to interpret some parts of your app at runtime, while AOT compiling the rest.
When you set UseInterpreter to True, it still AOTs everything it can in all assemblies, while bits of code that cannot be compiled to native code, are compiled to MSIL, then JIT-compiled at runtime.
Another way to enable the interpreter is to use MTouchInterpreter MSBuild property:
-all in the following example says to AOT compile all assemblies (that can be AOT compiled), while still allowing the interpreter to perform dynamic code generation:
<PropertyGroup Condition="$(TargetFramework.Contains('-ios')) and '$(Configuration)' == 'Release'">
<MtouchInterpreter>-all</MtouchInterpreter>
</PropertyGroup>
To be concluded, either using
<UseInterpreter>True</UseInterpreter> or <MtouchInterpreter>-all</MtouchInterpreter> is fine as it AOTs everything it can in all assemblies, while some bits of code (such as generics, reflection) will be interpreted.
For more info, please refer to Enable the interpreter.