Weil deine Liste damit read-only ist. Bin mir gerade selber nicht sicher, wie der Mechanismus dahinter ist, aber mit <? super Object> sollte es funktionieren (laut Pecs: Producer extends, Consumer super).
Dein T ist ein unbekannter, aber fester Typ. Ein ? kann dagegen alles mögliche sein, das heißt dass in deinem Eingangsbeispiel tv eine TableView<String> sein kann, an der du dann z.B. eine ObservableList<Date> zu setzen versuchst. Du kannst mit ? also nicht garantieren, dass die zur Laufzeit übergebenen Typen “zusammenpassen”, während das in deinem zweiten Beispiel immer sichergestellt ist (weil schon der Compiler rummeckern würde, wenn du T mit verschiedenen Typen belegen würdest).
? extends Object ist das gleiche wie ? (alles extended Object, automatisch).
Und… wenn dort sowieso keine spezifischen Typinformationen benötigt werden, könnte man vielleicht auch einfach TableView<Object> verwenden (je nachdem, wie und wo das genau verwendet werden soll)