Ya lo he comentado, pero sigo pensando que es una opción válida, solo pruebe si en su entorno es mejor una solución u otra. En mi caso particular, el uso source.ForEach(p => dest.Add(p))funciona mejor que el clásico, AddRangepero no he investigado por qué en el nivel bajo.
Puede ver un código de ejemplo aquí: https://gist.github.com/mcliment/4690433
Entonces la opción sería:
var allProducts = new List<Product>(productCollection1.Count +
productCollection2.Count +
productCollection3.Count);
productCollection1.ForEach(p => allProducts.Add(p));
productCollection2.ForEach(p => allProducts.Add(p));
productCollection3.ForEach(p => allProducts.Add(p));
Pruébalo para ver si te funciona.
Descargo de responsabilidad : no estoy abogando por esta solución, encuentro Concatla más clara. Simplemente dije, en mi discusión con Jon, que en mi máquina este caso funciona mejor que AddRange, pero él dice, con mucho más conocimiento que yo, que esto no tiene sentido. Ahí está la esencia si quieres comparar.