Combine the onions, tomatoes, garlic, pepper, paprika, cumin, coriander, and cardamom in a food processor and puree until smooth.
Put the lamb in a shallow baking dish and pour the marinade over to cover. Cover with plastic wrap and chill in the refrigerator for at least 3 hours or up to overnight.
Bring the lamb to room temperature, about 30 minutes, before grilling.
Preheat an outdoor grill to medium-high heat and rub with oil to prevent sticking.
Remove the lamb from marinade, reserving the marinade for basting, and season generously with salt and pepper on all sides.
Lay the lamb on the grill and cook for 15 to 20 minutes. Using tongs, carefully flip the lamb over and grill the second side for 15 to 20 minutes more, basting with reserved marinade occasionally. If necessary, move the lamb around the grill to avoid flare-ups. The internal temperature of the lamb should register 125 to 130-degrees F for medium-rare.
Transfer the lamb to a cutting board and tent with aluminum foil. Let the lamb rest for 15 minutes (internal temperature will rise to 135-degrees F while the meat stands.) Thinly slice the lamb across the grain.