In a large mixing bowl, mix together the yogurt, garlic, ginger, garam masala, salt, turmeric, cumin, and chili powder for the marinade.
Add the chicken pieces and mix until coated. Cover the bowl and transfer to the refrigerator to marinate overnight. (see note)
Place a large deep-sided skillet over medium heat, add 2 tablespoons of butter, and let it melt. Working in batches, sear the chicken on all sides. (I did this in 4 batches using 2 tablespoons of butter per batch.) Transfer the chicken to a plate once cooked.
If needed, add a little more butter to the skillet. Add the onions and cook for about 5 minutes until fragrant. Scrape up the brown bits on the bottom of the skillet as they cook. Add the garlic and ginger and cook for 1 minute until fragrant.
Add the garam masala, cumin, salt, coriander, and chili powder and cook for 1 minute. Add the canned tomatoes with juices, stir to combine, and cook down for 15 minutes.
Remove from the heat, carefully transfer the sauce to a food processor or blender (in batches if needed), and process until thoroughly pureed. *Note: A food processor may give you a slightly more textured sauce than a high-powered blender.
Transfer the pureed sauce back to the skillet. Add the heavy cream, sugar, chicken, and any juices on the plate. Cook for 10-15 minutes on medium-low, stirring occasionally. (Thin the sauce with water or more heavy cream, if needed.)
Serve warm with cooked rice and naan bread. Garnish with chopped cilantro, if desired.
Notes
If you're in a rush you can marinate the chicken for at least 1 hour.
The chicken can be stored in a gallon-size ziploc bag instead of the mixing bowl if desired.