Patrik Berglund also scored for St. Louis, which swept its three-game road swing after losing five straight games.
Blues rookie goaltender Jake Allen made 28 saves and stopped the Canucks' Ryan Kesler and Alex Burrows in the shootout.
Kesler and Henrik Sedin had their first goals of the season and Mason Raymond also scored in regulation for Vancouver, which has lost two straight after winning six in a row.
The Canucks looked destined to lose in regulation after the Blues took a 3-2 lead early in the third period, but Raymond tied the game on a power play with 1:47 remaining.
A point shot took an errant bounce and landed on Raymond's stick at the left hash marks, and he buried his fifth of the season.
Burrows had a chance to win it with a breakaway in overtime, but his backhand move was thwarted when Allen gloved the puck.
Oshie's shootout goal froze Roberto Luongo, who stood motionless as Oshie skated in slowly and then whipped a shot between the goalie's legs.
The Canucks dominated the third frame, outshooting the Blues 15-3.
But it was Berglund, with his team-leading eighth goal of the season, who gave the Blues a 3-2 lead at the eight minute mark of the third.
St. Louis center Vladimir Sobotka wheeled around Vancouver's goal and into the slot and whipped a shortside wrist shot that Berglund deflected in. Sobotka was originally credited with the goal.
The Canucks had a golden opportunity to tie the game with a 41-second two-man advantage after Roman Polak and Alex Pietrangelo were penalized for questionable hits on Kesler. Polak had a head shot on Kesler, while Pietrangelo's came from behind.
The Blues held off that power-play attempt, but couldn't stave off Raymond on the next one.
Allen wasn't overly busy in the St. Louis net, but made key saves when he had to as he earned his third straight victory in as many careers starts.
[to top of second column]
Luongo made the start for Vancouver after Cory Schneider had an off night against Dallas on Friday, allowing four goals. Luongo, who has not lost in regulation this season, made 20 saves.
The teams were tied 2-2 after two periods, but it was the Blues who held a wide edge in play.
Using their speed and rolling four lines, the Blues hemmed the Canucks in their end for large stretches and dominated battles along the boards. Vancouver mustered just 11 shots through two periods.
The Blues were rewarded for their tenacity early in the middle frame, when McDonald notched his third of the season after Vladimir Tarasenko hit the post.
The Canucks led 2-1 after a slow-paced first period.
Kesler opened the scoring on a Canucks power play with his first of the season. He has a goal and an assist in two games after missing 10 months with shoulder and wrist injuries. When his name was announced for the goal, Kesler drew extended applause from the crowd.
Oshie responded with his fifth tally of the season just under 10 minutes later, beating a Canucks defenseman to a rebound in the slot and backhanding the puck into the open net.
Sedin is used to setting up pretty goals, but he was the beneficiary of a pretty feed from Burrows to put the Canucks ahead 2-1 late in the first period.
Sedin flubbed his shot, but the puck trickled into the open net anyway.
NOTES: Blues defenseman Barret Jackman tied Al MacInnis for seventh on the franchise's all-time games played list with 613. ... Defenseman Alex Edler played his 400th NHL game, all with the Canucks. ... Alexander Steen had his four-game goal-scoring streak and five-game points streak (4-5-9) snapped.
Copyright 2013 The Associated
Press. All rights reserved. This material may not be published,
broadcast, rewritten or redistributed.