Du kannst die Liste nur über einen Cast oder eine Wrapper in die Funktion reingeben, welcher keine Schreibfunktionen besitzt und so die Schreibfunktionen versteckt.
Oder eine Ableitung, wo bei den Settern eine
Exception ausgelöst wird.
Bei der TList fehlen leider die Array-Funktionalitäten, wie z.B. in der StringList,
TStringList.ToObjectArray
dann könntest du ganz einfach statt der Liste ein Array in die Funktion geben.
procedure foo(const MyList: TArray<TObject>);
Die generische TList<> kennt aber das .ToArray