The real question is why does one of them not work.
In TB.Prepare you can call (plain) Foo, since it is a protected ancestor method of TB.
But you cannot access FC.Foo (whether or not you cast it to TC).
Here you are not using an inherited method of TB, but trying to access a protected method of a completely foreign class (FC which is a TBBase, or a TC if you cast it).
If you redeclare Foo in TBBase and make it public, then it will be visible inside TB.Prepare, and you can call FC.Foo with no cast (although you will get an access violation since in your implementation FC is nil).
BTW your example has a memory leak, since you create c but never free it.
Also, your example compiles because you have added a "uses uC;" to the implementation of unit uB (to avoid a circular dependency between uB and uC).
This is usually a sign of poor or over-complicated class hierarchy design. OK, you did it so you could make the artificial TC() cast. But needing to do that sort of thing, even in a contrived example, often indicates that a simpler re-design would be an improvement.