Cook the ground beef in a skillet over medium-high heat until browned, about 6–8 minutes. Add diced onion and sauté for 3–4 minutes until soft.
Stir in garlic and cook for 1 more minute. Mix in taco seasoning and water; simmer for 5 minutes until thickened. Season with salt and pepper, then remove from heat.
In a saucepan, melt butter over medium heat. Whisk in flour and cook for 1 minute. Slowly whisk in milk until smooth.
Simmer gently while stirring. Reduce heat and whisk in cream cheese until melted. Add cheddar and Monterey Jack gradually, stirring until smooth.
Stir in bell pepper, tomatoes, garlic powder, onion powder, and cilantro. Season to taste and keep warm on low heat.
Preheat oven to 375°F (190°C). Place taco shells on a baking sheet and warm for 3–5 minutes until crisp.
Fill each taco shell with 2–3 tablespoons of beef. Spoon warm cheese sauce over the top and let it overflow slightly. Add extra shredded cheese and return to the oven for 2–3 minutes to melt.
Garnish with cilantro and serve hot with sour cream and hot sauce, if desired.