Genéricos, parámetros de tipo y comodines

Estoy tratando de entender los genéricos de Java y parecen extremadamente difíciles de entender. Por ejemplo, esto está bien ...

public class Main {

    public static void main(String[] args) {
        List<?> list = null;
        method(list);
    }

    public static <T> void method(List<T> list) { }
}

... como es esto ...

public class Main {

    public static void main(String[] args) {
        List<List<?>> list = null;
        method(list);
    }

    public static <T> void method(List<T> list) { }
}

... y esto ...

public class Main {

    public static void main(String[] args) {
        List<List<List<?>>> list = null;
        method(list);
    }

    public static <T> void method(List<List<T>> list) { }
}

... pero esto no compila:

public class Main {

    public static void main(String[] args) {
        List<List<?>> list = null;
        method(list);
    }

    public static <T> void method(List<List<T>> list) { }
}

¿Alguien puede explicar lo que está sucediendo en un lenguaje simple?

Respuestas a la pregunta(1)

Su respuesta a la pregunta