The first one: Your list is a List of some class X which is a superclass of Shape. The compiler doesn't know what X is. However since Rectangle is a subclass of Shape, it must also be a subclass of X, and therefore a Rectangle is an X. Since it's a List<X>, you can therefore add a Rectangle to it.
The third one: Your list is a List of some class X which is a subclass of Object. The compiler doesn't know what X is. As far as the compiler knows, X could be
String for example. And since it can't demonstrate that Rectangle is a subclass of this unknown X type, you can therefore not add a Rectangle to that List.
The second one is the same as the third one.