Heat a heavy-bottomed skillet (preferably cast-iron) over medium-high heat. Add the bacon and cook until crispy. Remove and set aside, reserving the drippings. Add the onions to the skillet and cook on medium-low, stirring, until slightly tender and the skillet has browned bits, about 3 minutes.
Meanwhile, sprinkle the uncooked shrimp with a few pinches of salt and pepper in a large bowl, then sprinkle with 1/4 cup flour and the garlic powder and toss. Set aside.
Turn the skillet up to medium-high heat and add the canola oil. Test the oil temperature by dropping in a dab of flour. When it sizzles, add the remaining 1/4 cup flour. Brown the flour and onions, adding more oil if too dry, until slightly dark brown. Add the shrimp and bacon, breaking the bacon into small pieces, and stir with a wooden spoon. Slowly whisk in the hot water and bring to a slight boil, then stir and reduce the heat to a simmer until the gravy thickens and browns, 5 to 10 minutes. Taste the gravy and add more salt, pepper or garlic powder if needed.
Serve the shrimp over the prepared grits topped with green onions.