In a large bowl, combine the beef and optional lamb or chicken with vegetable oil, onions, garlic, paprika, ground coriander, ground cumin, black pepper, thyme, salt, soy sauce (if using), and vinegar or lemon juice.
Mix well to coat the meat with the spices. Cover and refrigerate for at least 1 hour, preferably overnight.
Preheat a grill or a large skillet over medium-high heat.
Remove the meat from the marinade and grill or sear in batches, turning occasionally, until browned and cooked to your desired level of doneness. This should take about 10-15 minutes per batch, depending on the size of the meat cubes.
While the meat is cooking, chop the fresh vegetables. You can grill or sauté them if desired, or serve them fresh.
Arrange the cooked meat on a serving platter. Serve with the fresh vegetables, pap (maize meal), and chakalaka if desired.
Enjoy your meal!