Heat a medium soup pot over medium-high heat with 2 tablespoons oil. Add the onions, 3/4 of the garlic, the chili powder, cumin, salt and pepper. Cook for about 3-4 minutes, until the onions are tender, stirring frequently.
While the onions are cooking, in a shallow dish combine the remaining garlic, the remaining 3 tablespoons olive oil, the red pepper flakes, lime zest, parsley and a little salt. Add the shrimp and coat them thoroughly in the mixture. Let the shrimp sit while you prepare the soup.
Add the black beans to the skillet with the onions. With a potato masher or the back of a rubber spatula, smash half of the beans (the mashed-up beans will thicken the soup). Add the tomatoes, chicken stock and heavy cream (if using) to the pot, stir and turn the heat up a bit to bring the soup to a bubble. Once at a bubble, turn the heat back down to a simmer and let it cook for 10-12 minutes. Give the pot a stir every now and then to ensure that it is not sticking.
While the soup is simmering, preheat a large skillet over medium-high heat. Once it’s hot, add the shrimp and cook 2-3 minutes on the first side. Flip the shrimp, add the remaining lime juice and cook another 2-3 more minutes or until the shrimp are opaque.
Taste the soup and adjust the seasoning with salt, pepper and hot sauce. To serve, place a few ladles full of the soup in shallow soup bowls and stand 4 shrimp in the center of each bowl.