England, at the third day's close, were 50 for two in their second innings, still needing 269 more runs to make South Africa bat again after Ntini had removed opener Andrew Strauss and captain Michael Vaughan.
De Villiers's 174 was the cornerstone of South Africa's 522 all out, which also featured a Test-best 149 from vice-captain Ashwell Prince.
That gave South Africa a first innings lead of 319 after they'd bowled England out for a meagre 203.
De Villiers had been booed by the crowd as he first came out to the crease after claiming a slip catch off Strauss, when replays showed the ball had bounced, on Friday.
Although Strauss was given not out on that occasion, the incident created lingering ill-feeling towards de Villiers amongst both spectators and the England team.
"I walked out there and it is the first time I had been booed coming out on to the field," de Villiers said.
"That was quite disappointing but, if anything it motivated me to do better and it is very satisfying to be sat here with a hundred under my belt."
Fast bowler Ntini, coming from round the wicket, had Strauss out for nought on Sunday after the left-handed opener edged a full, rising ball through to wicket-keeper Mark Boucher.
What had seemed a placid pitch when England bowled, appeared a very different surface as Ntini and fellow quick Dale Steyn tested the batsmen with a succession of sharp deliveries.
Ntini, who finished the day with two wickets for 16 runs in nine overs, saw his accuracy rewarded again shortly before stumps when Vaughan got an outside edge which was well-held by a diving Boucher.
Alastair Cook was 23 not out and nightwatchman James Anderson nought not out at stumps.
"We're going to have bat well tomorrow, really dig in," Anderson said. "They are going to come out all guns blazing."
De Villiers's stand of 212 with Prince was a new South Africa record for the fifth-wicket against England, surpassing the 192 shared by Gary Kirsten and Boucher at Durban in 1999.
He also enjoyed handy partnerships of 67 and 74 down the order with Boucher and Paul Harris respectively.
De Villiers's innings of more than eight-and-a-half hours ended spectacularly when his edged drive off Stuart Broad was brilliantly caught one-handed by Andrew Flintoff, diving to his left, at first slip.
In all, he faced 380 balls and hit 18 fours.
Anderson bowled 44 overs for a haul of three for 136 while Flintoff, playing his first Test after 18 months out with ankle and side injuries, pounded away for 40 overs on his way to an economical return of one for 77.
South Africa were 480 for seven at tea, with de Villiers 158 not out and Harris 11.
After the break, de Villiers twice drove Anderson for resounding boundaries.
Harris then got in on the act, going down the pitch to drive Monty Panesar for six before he exited soon after de Villiers when his opposing spinner had him holing out for 24.
Left-armer Panesar, who finished with three for 65 after dismissing three tailenders, had earlier taken his first wicket in 82 overs when be bowled paceman Morne Morkel for nought.
Before lunch, England had finally seen the back of Prince with controversial debutant Darren Pattinson having the left-hander caught behind by Tim Ambrose.
Prince, who'd made 101 in the drawn first Test at Lord's, had batted for nearly seven hours, facing 284 balls with two sixes and 17 fours.
De Villiers spent 13 balls on 99, but he got the run he wanted off Flintoff to complete his sixth Test hundred in 264 balls with 11 fours.
South Africa resumed Sunday on 322 for four with Prince 134 not out and de Villiers 70 not out.
When Prince drove Broad on the up, for four through extra-cover, be beat his previous highest Test score of 139 not out against Zimbabwe at Centurion three years ago.