Agora entendi que é muitos para muitos. Mas analisando teu código eu suspeito de um equivoco.
Em um relacionamnto many-to-many eu teria lista dos dois lados. Mas vi que você tem a classe PromocaoProduto. Sendo assim, você teria o relacionamento, tanto de promoção quanto de produto com essa classe.
Então, nas classes produto e Promocao você teria uma lista de PromocaoProduto. Assim:
public class Promocao {  
    public int PromocaoId { get; internal set; } 
    public string Descricao { get; internal set; } 
    public DateTime DataInicio { get; internal set; } 
    public DateTime DataTermino { get; internal set; } 
    public IList<PromocaoProduto> promocoesProduto { get; internal set; }
}
public class Produto { 
    public int ProdutoId { get; internal set; } 
    public string Nome { get; internal set; }  
    public string Categoria { get; internal set; } 
    public double PrecoUnitario { get; internal set; } 
    public string Unidade { get; internal set; } 
    public IList<PromocaoProduto> promocoesProduto { get; internal set; }
}
public class PromocaoProduto { 
    public int ProdutoId { get; set; } 
    public Produto Produto { get; set; } 
    public int PromocaoId { get; set; } 
    public Promocao Promocao { get; set; } 
}
Veja que na classe PromocaoProduto ele tem os objetos e em nas classes Produto e Promocao tem a lista de PromocaoProduto. 
Existe uma outra possibiliade que seria sem a classe PromocaoProduto. Mas de acordo com teu código, não seria aplicável.