The only difference is this line
ExecuteInterface(FTestClass);
The "ExecuteInterface" and "FListInterface.Add" methods are expected an interface parameter, but you pass the class parameter. An implicit conversion is made, but you do not control the lifetime, so the object (this is the interface) by the reference counter "dies" on the first call.
There are different solutions.
1. Skip a reference counter in methods:
procedure ExecuteInterface(
const Test: ITest);
2. Explicit add reference:
ExecuteInterface(FTestClass
as ITest);
3. Use a variable of the desired type (the safest solution):
procedure TForm1.FormCreate(Sender: TObject);
var
LTest: ITest;
begin
FListInterface := TListInterface.Create;
FTestClass := TTestClass.Create;
LTest := FTestClass;
ExecuteInterface(LTest);
FListInterface.Add(LTest);
end;