To expand on Paul's answer, by declaring shapeSuper as List<? super Shape>, you are saying that it can accept any object that is a super class of Shape. Object is a superclass of shape. This means that the common superclass of each of the list's elements is Object.
This is why you have to use the Object type in the for loop. As far as the compiler is concerned, the list might contain objects that are not Shapes.