City controlled the first half for long stages and always looked the more dangerous side.
It was no surprise when Steve Cotterill's men moved ahead in the 18th minute as the dangerous Jay Emmanuel-Thomas cut in from the right and hammered a powerful 20-yard drive past Joe Anyon for his 18th goal of the season.
Wade Elliott nearly doubled the advantage but his dipping volley just cleared the crossbar.
Shrewsbury had been toothless going forward until they pulled level in stunning style in the 41st minute.
Skipper Tamika Mkandawire carried the ball forward and unleased a blistering shot from 30 yards out which, with the aid of a slight deflection, flew past Frank Fielding for his first goal of the season.
Ten minutes into the second half and Mkandawire netted again, but this time at the wrong end as he turned Sam Baldock's cross into his own net.
The Shrews replied again with Paul Parry powerfully heading home Dave McAllister's cross from the right on the hour mark.
But City grabbed what proved to be the winner in the 63rd minute when Joe Bryan was left unmarked at the far post to loop in a header from a Emmanuel-Thomas corner.
Shrewsbury have now gone nine home games without a win, losing seven of them.