Почему нельзя было обойтись одним промежуточным слоем?
https://github.com/dotnet/standard/blob/master/docs/history/evolution-of-design-time-assemblies.md
Допустим, что мы хотим изобразить .dll-ку, которая реализует функции и выставлет некоторый API.
Ну ок, берём и делаем просто .dll-ку.
Первое усложнение: сменилась версия интерфейса и теперь нужно два уровня и три dll-ки:
— две с разными интерфейсами и одна с реализацией.
А зачем делать ещё два уровня?