Esse tipo List é uma interface que representa os métodos principais para as classes lidarem com uma sequência (um conjunto ordenado) de elementos. Então, como um ArrayList é uma classe que lida com um conjunto ordenado de elementos, essa classe acaba implementando a interface List.
Existem várias outras classes que implementam List, por exemplo: LinkedList, AbstractList...
Como na nossa aplicação usamos as funcionalidades principais de uma lista (adicionar, remover, buscar pela posição...), não usamos nada específico de uma ArrayList. Então, podemos nos referir ao nosso ArrayList como List, usando polimorfismo.
Mas se não usamos nada específico da ArrayList, por que usamos esse objeto então?
Se fizéssemos new List<Aluno> teríamos que implementar todos os métodos de uma List, pois ela é somente uma interface. Para evitar isso, usamos uma classe que já tem os métodos implementados, no caso a ArrayList.