Preheat oven to 350 degrees. In a large Dutch oven or heavy pot, heat oil over medium-high. Add onions and season with salt and pepper. Cook, stirring occasionally, until softened, about 5 minutes. Add garlic and cook until fragrant, about 1 minute. Add tomatoes (if using canned, break them up) and cook until they break down, 6 to 8 minutes.
Place lamb shanks in pot in a single layer so each shank is covered by sauce. Bring to a boil, cover, then place pot in oven. Cook until meat is very tender and falling off bones, about 3 1/2 hours. Skim fat from cooking liquid and season lamb with salt and pepper. Serve lamb with sauce.
Swap It: Beef shins, a very affordable cut, or oxtails would be good in place of lamb shanks.
We made this with short ribs instead of lamb shanks (the supermarket was out of shanks) and it came out great. Very easy to make and the sauce is delicious. (When made with the short ribs, it is also very rich.) For leftovers, we shredded the meat and served it over pasta.