Heat the oil in a large heavy pot over high heat. Brown the beef in batches - don't crowd the pot, or it will steam instead of browning - then set aside.
Reduce the heat to medium and cook the onions for about 10 minutes until soft and golden.
Stir in the garlic and ginger and cook for 1 minute until fragrant, then add the curry powder, turmeric and chilli powder and cook for a further minute, stirring constantly, to bloom the spices in the oil.
Return the beef to the pot along with the chopped tomatoes and beef stock. Bring to a simmer, then cover and cook on low heat for 2-2.5 hours, stirring occasionally, until the beef is fork-tender.
Stir in the coconut milk if using, and simmer uncovered for a further 10 minutes to thicken the sauce. Season to taste with salt, scatter over fresh coriander, and serve with rice or naan.