Heat 2 tbsp of vegetable oil in a large heavy-based pan over medium-high heat. Add the diced lamb shoulder and sear until browned on all sides. Remove the lamb and set aside.
In the same pan, add an additional 1 tbsp of vegetable oil. Add the cumin seeds, coriander seeds, cardamom pods, bay leaves, and cinnamon stick. Fry until fragrant, about 1 minute.
Add the finely chopped onions to the pan and sauté until golden brown, about 8 minutes.
Stir in the minced garlic and grated ginger, cook for another 2 minutes.
Add the chopped tomatoes, tomato puree, turmeric powder, and red chilli. Cook until the tomatoes are soft and the oil begins to separate from the mixture, about 5 minutes.
Return the seared lamb to the pan. Stir in the coconut milk and garam masala. Season with salt and black pepper to taste. Bring to a simmer, cover, and cook on low heat for 1.5 to 2 hours or until the lamb is tender.
While the curry is simmering, rinse the basmati rice under cold water until the water runs clear. Cook according to package instructions.
Once the lamb is tender, adjust seasoning if needed. Garnish with fresh coriander before serving.
Serve the lamb curry over a bed of basmati rice.