Bring a large pot of salted water to a boil. Cook the shells for 1 minute less than indicated on the box. Drain and let cool. Spray a 9- by 13-inch casserole dish with nonstick spray.
Heat a large high-sided skillet over medium-high heat. Add the beef and sausage and cook until browned, while stirring and breaking up with the back of a wooden spoon, 3 to 4 minutes. Stir in the carrots and onions and cook until softened, about 4 minutes more. Stir in the garlic and red pepper flakes if using, and cook until fragrant, about 1 minute. Add the crushed tomatoes and simmer on medium-low, uncovered, for 20 minutes. Stir in the basil at the end.
Rinse the spinach in a colander with cold water. With water still clinging to the leaves, add the spinach to a large nonstick skillet over medium heat and toss with tongs until wilted. Remove from the heat and let cool. Once cool, wrap in paper towels and squeeze out any excess moisture. Chop roughly.
Preheat the oven to 350 degrees F.
In a large bowl, add the spinach, ricotta, 1/2 cup of the mozzarella, 1/4 cup of the Parmesan and the egg and give it a stir until well combined.
Spread 3 ladlefuls of sauce on the bottom of the prepared casserole dish. Stuff each shell with about 1 heaping tablespoon of spinach and cheese mixture. Place the shells in the dish and then cover with more sauce. Sprinkle the casserole with the remaining 1/4 cup Parmesan and remaining 1/2 cup mozzarella. Cover with foil and bake for 30 minutes. Remove the foil and keep baking until the cheese is melted and bubbly, another 5 minutes.