If the 12yo in question knows a bit of programming, a much simpler thing to explain would be the Halting problem, both the statement and the proof.
The bulk of Godel's proof is introducing recursive functions and the "godelization", which means mapping formulas to natural numbers and functions to arithmetic/first order expressions. This all comes for free if you know any programming language; if you don't like natural numbers, you can use strings (the source code itself and its manipulations).
From there, the diagonalization used in the Halting problem proof is the same used in Godel's theorem. In fact, the two theorems are intimately connected, essentially by the statements "you can write a first-order proof verifier in a programming language", and "you can write a computable function as a first-order arithmetic formula".
Great observation; as an undergrad, noticing this suddenly made GIT (which was taught to me by a mathematician in all its intricate detail) seem a lot less scary.
Indeed, the proof of the halting problem is much easier to sketch than the proof of Godel's incompleteness theorem (which the OP doesn't even attempt). So here he goes: a proof sketch of the halting problem for 12 year old programmers.
Suppose that somebody wrote us a program that can check whether another program will loop indefinitely or eventually halt when run on a particular input:
bool halts(string program, string input){
// halting checking code that checks
// whether program's main function
// halts when given input
// returns true or false
}
Note that this is a perfectly valid program. halts() is supposed to work on any program, including a program that happens to contain the source code of halts(). We can just reuse the code that the person gave us and copy-paste it here.
Now the question is: what will our halts() function say about this program, when given its own code as input? In other words: what will the following code print?
There are just 2 possibilities: either this program prints true, or this program prints false (if this program never terminates then halts() has a bug).
Case 1: suppose halts(program,program) returns true.
If the halts function is working correctly, that means that when we actually run the code in `program` with `program` as its input, it will halt. But now lets see what actually happens. When we run the main() function in `program` with `program` as its input, it first checks `if(halts(program,program))`. Well, we already assumed that halts returns true, so control flow will go inside the if block to the infinite loop. But that means that halts lied to us!
Case 2: suppose that halts(program,program) returns false.
Now a similar argument holds. run the code in `program` with `program` as its input, the condition of the if statement will be false, and the main function will terminate. So even though halts(program,program) returns false, the program actually terminates. It lied again!
As you can see, no matter what halts returns, it cannot tell the truth about the program we constructed. Hence it is impossible to fill in the missing code in halts() so that it will work correctly.
The bulk of Godel's proof is introducing recursive functions and the "godelization", which means mapping formulas to natural numbers and functions to arithmetic/first order expressions. This all comes for free if you know any programming language; if you don't like natural numbers, you can use strings (the source code itself and its manipulations).
From there, the diagonalization used in the Halting problem proof is the same used in Godel's theorem. In fact, the two theorems are intimately connected, essentially by the statements "you can write a first-order proof verifier in a programming language", and "you can write a computable function as a first-order arithmetic formula".