Place the beef in a large pot with water, garlic, oregano, and a bay leaf. Bring it to a boil, then reduce to a simmer. Cook until the meat is fork-tender—usually about 1.5 to 2 hours. Skim off any foam that rises as it cooks.
Let the beef cool slightly, then shred it using two forks or your hands. Set it aside to cool completely (you can refrigerate it if making ahead).
In a small bowl, whisk together the vinegar, olive oil, lime juice, soy sauce, garlic, oregano, salt, and pepper. Taste for salt and adjust if necessary.
While the meat cools, shred the lettuce, dice the tomatoes, slice the onion thinly, chop the cilantro, jalapeño and finely dice the serrano if using. If you want the onion to be milder, soak the slices in lime juice for 20 minutes then add to the salad.
In a large bowl, combine the shredded beef with all the chopped veggies. Pour the dressing over and mix everything together until evenly coated.
You can make everything ahead and assemble right before serving. Or you mix all ingredients except the lettuce and add right before serving to conserve the crispness.