If you really require every Enemy to register themselves into the dictionary on Awake, then the dictionary must be accesible from the Awake method. For example a singleton or making eDictionary public and static. I would go for the singleton, with specific methods for adding and removing Enemies to and from the dictionary. But your needs might vary.
This is a proposal using a static class.
public static class EnemyStacks
{
static Dictionary<Type, Stack<Enemy>> eDictionary;
static EnemyStacks()
{
eDictionary = new Dictionary<Type, Stack<Enemy>>();
}
public static void Push<T>(T enemy) where T: Enemy
{
if(!eDictionary.ContainsKey(enemy.GetType())
{
eDictionary.Add(enemy.GetType(), new Stack<T>());
}
eDictionary[enemy.GetType()].Push(enemy);
}
public static Enemy Pop<T>() where T: Enemy
{
return eDictionary[typeof(T)].Pop();
}
}