Por que preciso fazer referência a uma dll que não estou usando diretamente?

Tenho o código fonte que recebi de um desenvolvedor externo, este código é dividido em 4 tipos de projetos: sua estrutura, o ambiente para o meu projeto (vamos chamá-lo de "ENV"), a base de aplicativos (chamada "Base") e o próprio aplicativo (cerca de 20 dlls, eu vou chamar coletivamente de "aplicativo").

Agora, adicionei outra camada a essa bagunça, uma dll chamada AdvanceFeatures. Está bem abaixo do ENV (no topo da estrutura). Esta dll referencia nada além da estrutura e a ENV faz referência a ela. Somente o ENV faz uso desta DLL AdvanceFeatures, enquanto a Base e o aplicativo usam apenas o ENV.

A maneira como estou trabalhando aqui é que a maioria dos objetos no aplicativo são definidos na Base e herdam / implementam classes / interfaces no ENV. Também uma pequena parte desses objetos (no App e no Base) herda / implementa classes / interfaces da própria estrutura (mas isso é bastante raro

té agora, tudo está bem, exceto por um fato. O compilador exige que eu adicione uma referência à DLL AdvanceFeatures de cada uma das DLLs no App e da Bas

Não uso AdvanceFeatures fora da ENV, por que essas referências são necessárias?

Edit: Eu criei um projeto de demonstração para este problema. Estes são os detalhes do projeto:

Assembly: AdvanceFeatures
References: Nothing (Reference project-folder is empty)
Classes: Decorator, IEnvClass, IDecorator
IDecorator contents:
namespace AdvanceFeatures
{
    public interface IDecorator
    {
        IEnvClass Decorated { get; }
        void Decorate();
    }
}

IEnvClass contents: 
namespace AdvanceFeatures
{
    public interface IEnvClass
    {
        string Name { get; set; }
    }
}

Decorator contents:
namespace AdvanceFeatures
{
    public class Decorator : IDecorator
    {

        public Decorator(IEnvClass decorated)
        {
            Decorated = decorated;
        }

        #region Implementation of IDecorator

        public IEnvClass Decorated { get; set; }

        public void Decorate()
        {
            Decorated.Name = "NewName";
        }   

        #endregion
    }
}

Assembly: ENV
References: AdvanceFeatures (Compiled DLL)
Contents of only class SomeEnvClass:

namespace ENV
{
    public class SomeEnvClass : AdvanceFeatures.IEnvClass
    {
        public string Name { get; set; }
        private readonly AdvanceFeatures.IDecorator _decorator;

        public SomeEnvClass(string name)
        {
            Name = name;
            _decorator = new AdvanceFeatures.Decorator(this);
            _decorator.Decorate();
        }

        public string Foo()
        {
            return Name;
        }
    }
}


Assembly: TestBase
References: ENV (compiled DLL)
Contents of only class SomeEnvExtendingClass:

namespace TestBase
{
    public class SomeEnvExtandingClass : ENV.SomeEnvClass
    {
        public SomeEnvExtandingClass(string name) : base(name)
        {
        }
    }
}

Eu recebo o erro:

Error 1 O tipo 'AdvanceFeatures.IEnvClass' é definido em um assembly que não é referenciado. Você deve adicionar uma referência ao assembly 'AdvanceFeatures, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'. E: \ Projetos \ Dev \ TestReferenceInheritance \ TestBase \ SomeEnvExtandingClass.cs 3 18 TestBase

Agora, eu sei por que a DLL deve estar disponível para o executável compilado, mas por que o desenvolvedor deve conhecer o funcionamento interno do ENV (mais especificamente, é a árvore de herança) para estendê-l