It's a common misconception in the amateur Linux/Unix world that "Control C", AKA "intr" or "interrupt" (not to be confused with the CPU concept of an interrupt) is a keyboard shortcut. It isn't, really. Not ostensibly.
This all goes way back the very very early days of ASCII, when it was both a character set and a communications protocol. (Remember that the "II" stands for "Information Interchange".)]
ASCII defines a series of seven-bit codes, each of which has some fixed meaning. For the "printable" subset of these codes, we commonly describe this relationship as though a given code 'means' some character; but from the communications protocol point of view it's more like they 'mean' to print some character. i.e. 61h doesn't just mean 'a', it means "print 'a' and advance the cursor".
Actually, "cursor" is the wrong word to use here. We think of ASCII as something computers and only computers use, but this wasn't the case in the early days. ASCII is a telegraph code. Helpful for computers, yes, but built from the ground up to allow operators to control typewriters (teletypewriters, AKA TTYs) from across the world over the telegraph network.
That's why there are more than just printing codes. These are the "non-printing" or "control" codes, designed to control the typewriter on the other end. You're probably familiar with some of them: 20h, AKA "Space", which advances the type head but prints nothing; 0Dh, AKA "Carriage Return", which puts the type head back the start of the line; 0Ah, AKA "Line Feed", which advances the paper one line; and 09h, AKA "Tab", which advances the type head some configurable amount.
Some of them you're probably less familiar with. 07h is "Bell". It rings a bell on the receiving end, perhaps to wake them up and let 'em know a message is coming. There's 06h and 15h, Acknowledge and Negative Acknowledge. There's 01h, 02, 03h and 04 -- Start of Heading, Start of Text, End of Text, and End of Transmission. There are codes to turn on and off the receiver's peripherals like a tape punch recorder or reader. There are codes to delimit files and records. There's a backspace code! Everything you could want as a telegrapher in 1963.
We run into a problem when trying to type these control codes, though. By definition they don't really print anything, so what are we gonna put on the keys? Furthermore, there are a lot of control codes. Even if we figure out what should be on the keys it'll double the size of our typewriters to include them all! (I mean we can do it for some of 'em, like "Space" which already has a key, but "BEL"? "ACK"? "X-ON"?)
Fortunately, there's an existing solution to this kind of problem. Here's a picture of the keyboard of a Teletype Model 33, one of the first products to use ASCII, and it shows this solution:
See that "CTRL" key? Forget how you think it works.
Y'know how when you press "shift" on an old mechanical typewriter, it physically "shifts" the type basket down so you can use capital letters and punctuation marks? Like, shift-g isn't a "keyboard shortcut" for 'G" so much as "how you type 'G'". It selects between map layers, makes it so you don't need to have two keys for every letter.
Control does the same thing. Control-g is not a "keyboard shortcut" for ringing the bell, it's how you type "ring the bell".* Control-f is how you type "Acknowledge", control-s is how you type "turn off the tape reader", and so on and so on. All in the same way that shift-4 is how you type '$', and w is how you type 'w'.
So what's control-c? ^C is "End of Text". That's why it's used to end processes, alongside counterpart ^D "End of Transmission". You're not telling Linux you pressed "'control' and 'c'", you're telling you pressed "End of Text", and it knows "End of Text" means "end this process".†
If you take a look at the stty tool, you'll find that you can rebind some of these default actions. Maybe you want ^Y to be your interrupt instead of ^C. You can do that! Run stty intr ^Y in a terminal it'll do it. But you can't bind, say, control-9, because that's not a control character. Or control-., or control-page down, or "enter" on the numpad. The Linux line discipline has no idea what those are. It deals in characters, not keys.‡
That's why ^C isn't a keyboard shortcut.
*You'll commonly see these control characters transcribed with so-called "caret notation", where BEL is ^G, ACK is ^F, etc. The ^ means control, the letter indicates what key you'd press to type it.
†That's not to say that Linux interprets every control character like the spec says. ^W ("End of Transmission Block"), for example, is used for "word erase". Presumably because it starts with the letter 'w'. Under the hood it's still interpreting the keys you pressed as "End of Transmission Block", though.
‡You might wonder how the arrow keys work, then. You can think of them like macros. "Up" for example will type "^[[A" -- that's three characters, '^[' AKA "Escape", '[' AKA "Left Square Bracket", and 'A' AKA "Latin Capital Letter A". "Down" is "^[[B", "Right" is "^[[C", and "Left" is "^[[D". These work...sorta like printf formatting strings. '^[' tells Linux that next couple characters contain control information and not their usual meanings. Read more about this here.