Olá, Jonas!
Parabéns por mais uma excelente entrega. É muito bom ver como você está consolidando o uso de polimorfismo no C#.
Sua solução tá impecável, especialmente pelo uso de propriedades com setter privado (private set) e o construtor protected na classe base. Essas são práticas recomendadas que garantem que o estado do seu objeto não seja alterado de fora da classe, reforçando o pilar do encapsulamento. Ao tratar a lista de forma genérica como List<Midia>, você aproveita o máximo da flexibilidade que a orientação a objetos oferece.
Para avançar ainda mais, você pode explorar como o C# lida com o encapsulamento e modificadores de acesso, o que ajuda a proteger as regras de negócio do seu sistema.
Você conseguiu notar como a combinação de classe abstrata com métodos virtuais ajuda a definir um contrato claro para quem for criar novos tipos de mídia no futuro?
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!