var categoriesAndProducts =
  from c in categories
  join p in products on c.IdCategory equals p.IdCategory
    into productsByCategory
  from pc in productsByCategory.DefaultIfEmpty(
    new Product {
      IdProduct = String.Empty,
      Description = String.Empty,
      IdCategory = 0})
  select new {
    c.IdCategory,
    CategoryName = c.Name,
    Product = pc.Description
  };

foreach (var item in categoriesAndProducts) {
  Console.WriteLine(item);
}
