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.