Поскольку контракты для FrenchGreeter и EnglishGreeter одинаковы, StructureMap не будет знать, какой из них использовать. Для каждой проводки он использует только один экземпляр на контракт. Попробуйте что-то вроде этого:
For<IGreeter>().Use<FrenchGreeter>().Named("French");
For<IGreeter>().Use<EnglishGreeter>().Named("English");
For<IAppEngine>().Use<AppEngine>()
.Ctor<IGreeter>("French").Is(x => x.TheInstanceNamed("French"))
.Ctor<IGreeter>("English").Is(x => x.TheInstanceNamed("English"));