Chasing 246 to win from a rain-reduced 43 overs after Dutch captain Scott Edwards made a crucial 78 not out, South Africa, one of the tournament favourites, were bowled out for 207 in the shadow of the Himalayas.
In November last year, the Dutch sent South Africa crashing of the Twenty20 World Cup in Australia.
The victory was the World Cup’s second major shock in three days after Afghanistan defeated defending champions England on Sunday.
There was no hint of the drama to come as South Africa eased comfortably to 36-0 in their pursuit.
However, four wickets then fell for the addition of just eight runs. Quinton de Kock had cracked back-to-back centuries in South Africa’s impressive opening wins over Sri Lanka and Australia.
But on 20 he was caught behind off Colin Ackermann, one of three South African-born players in the Dutch starting line-up.
Ackermann had been man-of-the match when the Netherlands shocked South Africa in Adelaide last year.
Skipper Temba Bavuma (16) fell three runs later, clean bowled by Roelof van der Merwe who played 13 ODIs for South Africa before moving to the Netherlands.
Seamer Paul van Meekeren beat the defences of Aiden Markram for one before Van der Merwe’s wily left-arm spin tempted Rassie van der Dussen into a rash reverse sweep with the catch taken by Aryan Dutt at backward point.
De Kock, Markram and Van der Dussen had all made centuries in South Africa’s World Cup record total 428 in the win over Sri Lanka.
Heinrich Klaasen and David Miller steadily rebuilt the innings in a 45-run partnership for the fifth wicket before Logan van Beek broke through. Klaasen on 28 took on a long-hop and managed only to find Vikramjit Singh at fine leg, leaving South Africa teetering on 89-5.
Marco Jansen (9) saw his stumps scattered by Van Meekeren as South Africa slumped to 109-6 and it was virtually game over when David Miller swung and missed at Van Beek after making 43.
Bas de Leede mopped up Gerald Coetzee and Kagiso Rabada before Keshav Maharaj’s late, defiant 40 was ended by Van Beek.
It was the Netherlands’ first win at this World Cup after losses to Pakistan and New Zealand.
Earlier, Edwards played a brilliant innings while Van der Merwe shone with a late cameo as the Netherlands made a fighting 245-8.
Edwards’s runs came off 69 balls and featured 10 fours and a six. Van der Merwe, 38, hit a quickfire 29 off 19 balls with three fours and a six before he was caught behind off Lungi Ngidi.
Together, Edwards and Van der Merwe put on a crucial 64 for the eighth wicket after the Dutch were struggling at 112-6 following a delayed start due to rain.
Rabada claimed his 150th ODI wicket as South Africa’s feared pace attack ripped through the Netherlands top order in chilly, damp conditions.
Rabada reached his personal landmark when he struck with the first ball of his spell, cramping up opener Singh and forcing a top edge to Klaasen.
Singh had laboured to just two runs from 16 balls after the Dutch were put in to bat.
Rabada, playing in his 95th ODI, also accounted for the dangerous De Leede, lbw for two.
Max O’Dowd, Ackermann, Sybrand Engelbrecht and Teja Nidamanuru all reached double figures.
Equally all struggled to get on top of Rabada and fellow fast bowlers Jansen, Coetzee and Ngidi.
Spinner Maharaj got in on the act, tempting Van Beek to stretch and over-balance, allowing De Kock to effect the stumping.
However, that paved the way for Edwards and Van der Merwe to launch a rescue bid, ably assisted by Dutt who hit an undefeated 23 from nine balls with three sixes.
South Africa conceded 32 extras, including 21 wides.