The Hoops' wideman had the visitors ahead with just over a minute gone and four minutes from the end of a one-side half, left-back Emilio Izaguirre grabbed the second.
The second period was low-key but four minutes from time Perth defender Danny Grainger, booked for dissent following the opening goal, was awarded a second yellow by referee Calum Murray for a foul on Anthony Stokes.
In the final minute, with Saints' spirit broke, McGinn completed an impressive performance when he scored his second from a Cha Du-Ri pass to put the pressure on Rangers who play Inverness at Ibrox later today.
There was some disruption before the game when Celtic skipper Shaun Maloney, originally on the team sheet after recovering from an eye injury, had to withdraw due to illness.
Cha, dropped for Mark Wilson, was reinstated in midfield while Charlie Mulgrew was called down from the stand to go on the bench.
However, the disruption did little to disrupt the visitors and they took the lead with little over a minute gone, after Perth midfielder Liam Craig had fouled Georgios Samaras.
Midfielder Ki Sung-yueng cut the free-kick back to Stokes whose drive was parried by Saints keeper Graeme Smith to the feet of McGinn who slammed in the rebound from close range.
The Irishman then raced to take the acclaim of the Hoops fans behind the goal which earned him a booking from referee Murray.
The McDiarmid Park pitch had passed a morning inspection following heavy rain but Celtic adapted well and in the eighth minute Ki rattled a drive against the post after taking a clever pass from Stokes, with Cha driving the rebound from distance high over the bar.
The visitors looked in control and in the 19th minute, in a breakaway, Stokes had a low drive from 18 yards saved by Smith before the former Hibernian striker headed a Wilson cross wide from eight yards out.
Moments later Stokes again missed the target from another Wilson cross. It looked ominous for the Perth men.
St Johnstone had rallied from the loss of three early goals against Celtic in their Co-operative Insurance Cup defeat in midweek but there was nothing to encourage the home support.
Everything that went in the Saints box appeared to cause trouble and on the half-hour mark, Samaras blasted high over after being set up by stand-in captain Daniel Majstorovic.
As the first half drew to a close Marcus Haber and Peter MacDonald had efforts but Celtic keeper Fraser Forster remained untroubled.
In the 41st minute the home side were in further trouble when Izaguirre intercepted a slack back pass by Steven Milne at the edge of the box and burst through past Dave Mackay to slip the ball under Smith.
The match looked beyond St Johnstone and in the 49th minute only a fine save by Smith from Izaguirre, after good work by Stokes at the edge of the box in brushing off Mackay, prevented a third.
Moments later at the other end, Marcus Haber missed a sitter after Forster had parried from Jennison Myrie-Williams and would have been happy to see the flag raised for offside.
Sam Parkin and Collin Samuel replaced Milne and Peter MacDonald in the 57th minute as McInnes tried something different to get into the match.
The game was petering out although in a rare Saints attack Forster had to move smartly from his goal to take the ball away from the toes of Parkin. In the 82nd minute McGinn raced on to an Izaguirre pass down the left and cut the ball back for Samaras but the Greece international missed the target from 12 yards.
Four minutes from time Grainger walked after receiving his second and then McGinn grabbed his second with a mis-kicked shot from Cha's cut-back.
However, there was nothing fortuitous about Celtic's win.