Starcraft 2 let's you rebind almost any key in the hotkey setup, but not every key. For example you can't change modifiers like Shift or Ctrl etc. So basically, you can't change that in Starcraft 2 alone, unless you have expensive keyboard or you use 3rd party software, and sometimes you want to do it...
You will need 3rd party software called AutoHotkey.
(some of you may already know about this software, and how to use it - great stop reading, you will find nothing new here i believe.)
AutoHotkey - Download link (click)
How to install
Short tutorial how to create a simple script:
+ Show Spoiler +
1. Right-Click on your desktop.
2. Find "New" in the menu.
3. Click "AutoHotkey Script" inside the "New" menu.
4. Give the script a new name. Note: It must end with a .ahk extension. Ex. MyScript.ahk
5. Find the newly created file on your desktop and Right-Click it.
6. Click "Edit Script".
7. A window should have popped up, probably Notepad. If so, SUCCESS!
8. Remove the line
(because it can cause the ctrl to get stucked on certain machines)
9. At the end of the script add these two lines of code after the text:
LCtrl::LShift
Return
This makes the LCtrl to act as a LShift. If you want to change any other key first you type the key you want to change add "::" and type the desired key to remap it.
9. Save the changes
10. Run the script. (icon of AutoHotkey would appear in your system try that the script is running. You can right click to pause, reload or exit etc. As long as the script is running keyboard will be affected by your script, unless you pause or close the script.
You can do crazy stuff with AutoHotkey, so If you want to learn more about scripting follow the detailed help file of AutoHotkey.
2. Find "New" in the menu.
3. Click "AutoHotkey Script" inside the "New" menu.
4. Give the script a new name. Note: It must end with a .ahk extension. Ex. MyScript.ahk
5. Find the newly created file on your desktop and Right-Click it.
6. Click "Edit Script".
7. A window should have popped up, probably Notepad. If so, SUCCESS!
8. Remove the line
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
(because it can cause the ctrl to get stucked on certain machines)
9. At the end of the script add these two lines of code after the text:
LCtrl::LShift
Return
This makes the LCtrl to act as a LShift. If you want to change any other key first you type the key you want to change add "::" and type the desired key to remap it.
9. Save the changes
10. Run the script. (icon of AutoHotkey would appear in your system try that the script is running. You can right click to pause, reload or exit etc. As long as the script is running keyboard will be affected by your script, unless you pause or close the script.
You can do crazy stuff with AutoHotkey, so If you want to learn more about scripting follow the detailed help file of AutoHotkey.
My script for egg-hotkeying and selecting (remapped LShift with LCtrl):
+ Show Spoiler +
You can download it from here
I have added 1 more line of code that makes the script active, only when the Starcraft 2 window is active, so i can use my keyboard normally when i am not playing Starcraft.
I have also added a shortcut of my script in the Windows Startup folder, so my script runs when i turn on my computer.
If you don't know how to put the script in the startup folder:
+ Show Spoiler +
I have added 1 more line of code that makes the script active, only when the Starcraft 2 window is active, so i can use my keyboard normally when i am not playing Starcraft.
I have also added a shortcut of my script in the Windows Startup folder, so my script runs when i turn on my computer.
If you don't know how to put the script in the startup folder:
+ Show Spoiler +
1. Press the windows key on your keyboard
2. In the search bar type "run" (without the quotes) and press "Enter"
3. In there type in "shell:startup" (without the quotes) and press "Enter". This will open a folder for you (this is the Windows startup folder) create a shortcut from your script there, or simply put the script there.
Now whenever you start your PC the script will be active (but also only when you are playing SC2.
2. In the search bar type "run" (without the quotes) and press "Enter"
3. In there type in "shell:startup" (without the quotes) and press "Enter". This will open a folder for you (this is the Windows startup folder) create a shortcut from your script there, or simply put the script there.
Now whenever you start your PC the script will be active (but also only when you are playing SC2.
How i use AutoHotkey for SC2 (egg-hotkeying method for Zerg):
+ Show Spoiler +
Specifically i use AutoHotkey to change the behavior of the LShift and LCtrl, i actually only swap those with one another. My reason is simple, i play zerg, and i egg-hotkey.
The egg-hotkey method on standard hotkey setup looks like this:
+ Show Spoiler +
After the swapped LShift with LCtrl the method looks like this:
+ Show Spoiler +
It makes much more sense for egg-hotkeying right? Instead of holding down LCtrl than LShift to add the morphed units it to a control group, you only hold down LShift, click, and press a number without letting off the LShift.
- The drawback of this method is that you'll need to rebind every hotkey from Shift to Ctrl (and vice versa) in the hotkey setup in SC2. Becase you want everything else to stay (act) the same way as before (expect for this). Also your quee command is now on the CTRL instead of the SHIFT (no workaround for this without cheating and loong code).
- Selecting units now makes much more sense to me (perhaps because i am used working on Windows, holding down Ctrl to select or deselect from selection - now selecting/deselecting units, works the same in SC2 as in Windows, instead using the old way, with "Shift" to select or deselect units.
-You need like less than a week to get used to this method and you won't regret it. PiG actually uses this in his experimental "The Core" hotkey layout (he told me in the comments in one of my posts on reddit). I use it myself and i really love it. I believe you will as well
If you don't know how to egg-htokey you can learn from this tutorial in great detail
The egg-hotkey method on standard hotkey setup looks like this:
+ Show Spoiler +
1. produce units from larvae
2. LCtrl+click on the eggs //selects only the eggs without the rest of the larvae
3. LShift + control group [number] //adds the selected eggs in an existing control group or creates new if you haven't already..
2. LCtrl+click on the eggs //selects only the eggs without the rest of the larvae
3. LShift + control group [number] //adds the selected eggs in an existing control group or creates new if you haven't already..
After the swapped LShift with LCtrl the method looks like this:
+ Show Spoiler +
1. produce units from larvae
2. LShift+click on the eggs //selects only the eggs without the rest of the larvae
3. LShift + control group [number] //adds the selected eggs in an existing control group or creates new if you haven't already..
2. LShift+click on the eggs //selects only the eggs without the rest of the larvae
3. LShift + control group [number] //adds the selected eggs in an existing control group or creates new if you haven't already..
It makes much more sense for egg-hotkeying right? Instead of holding down LCtrl than LShift to add the morphed units it to a control group, you only hold down LShift, click, and press a number without letting off the LShift.
- The drawback of this method is that you'll need to rebind every hotkey from Shift to Ctrl (and vice versa) in the hotkey setup in SC2. Becase you want everything else to stay (act) the same way as before (expect for this). Also your quee command is now on the CTRL instead of the SHIFT (no workaround for this without cheating and loong code).
- Selecting units now makes much more sense to me (perhaps because i am used working on Windows, holding down Ctrl to select or deselect from selection - now selecting/deselecting units, works the same in SC2 as in Windows, instead using the old way, with "Shift" to select or deselect units.
-You need like less than a week to get used to this method and you won't regret it. PiG actually uses this in his experimental "The Core" hotkey layout (he told me in the comments in one of my posts on reddit). I use it myself and i really love it. I believe you will as well

If you don't know how to egg-htokey you can learn from this tutorial in great detail
WARNING
+ Show Spoiler +
EDIT: While the above method is not against the Blizzard's terms of use (because as long as "1 key press = 1 action" is allowed), though hoby2000 (in the comments) has a legit point.
UPDATE: To compensate for the concern that Blizzard can scan your running processes and simply get you banned for only using a software that's on their "watch list" while playing the game. For that matter we will do a workaround: We will mask the process with already existing (and widely popular process - Google Chrome (32 bit)
Here is a link to the compiled script (if you use the compiled script make sure to put that in your StartUp folder and remove original .ahk script from there if you did that earlier)
If you are concerned with safety of the .exe i provide (i totally understand), or you want to do it yourself in your own scripts, here is how:
+ Show Spoiler +
Also i have opened a thread on Blizzard official forums asking specifically for that matter and you can track it yourself here(still waiting for Blue to give a answer):
http://us.battle.net/sc2/en/forum/topic/20743114221
So final notice: I think the chances to get you banned for this is very very low especially if you compile and mask your script. And even if blizzard can sniff something suspicious (which i highly doubt it) they will probably first warn you before perma-ban you. And after all this is only a swapping the modifiers as you would with a keyboard that has the built in functions for that... which is 100% allowed by Blizzard.
Final words: Use at your own risk.
UPDATE: To compensate for the concern that Blizzard can scan your running processes and simply get you banned for only using a software that's on their "watch list" while playing the game. For that matter we will do a workaround: We will mask the process with already existing (and widely popular process - Google Chrome (32 bit)
Here is a link to the compiled script (if you use the compiled script make sure to put that in your StartUp folder and remove original .ahk script from there if you did that earlier)
If you are concerned with safety of the .exe i provide (i totally understand), or you want to do it yourself in your own scripts, here is how:
+ Show Spoiler +
1. Make sure you have installed google chrome, AutoHotkey (with the compiler) and Resource Hacker (download link)
2. Compile your script with AutoHotkey (here is how to do it), name your compiled script compiled_chrome.exe (for icon google search "google ico" and download and use that .ico file to compile yous script with)
3. Open your compiled script in Resource Hacker
4. Open another instance of Resource Hacker and open the original google chrome "chrome.exe" located in "C:\Program Files (x86)\Google\Chrome\Application" (now you have side by side the script and the original chrome exes)
5. In both instances of Resource Hacker navigate to "Version info> 1 : 1033"
6. Copy the whole code (on the right side in Resource Hacker) from the original chrome and paste it (replacing the original code) in your compiled script instance in resource hacker.
7. Press the compile button
8. File>Save As and name your file this time "chrome.exe"
That's it.
note: Actually you don't have to use google chrome specifically to mask your scripts, you can do it with any other .exe and you will mask it with just another name, or you could fill in the information with something entirely random.
2. Compile your script with AutoHotkey (here is how to do it), name your compiled script compiled_chrome.exe (for icon google search "google ico" and download and use that .ico file to compile yous script with)
3. Open your compiled script in Resource Hacker
4. Open another instance of Resource Hacker and open the original google chrome "chrome.exe" located in "C:\Program Files (x86)\Google\Chrome\Application" (now you have side by side the script and the original chrome exes)
5. In both instances of Resource Hacker navigate to "Version info> 1 : 1033"
6. Copy the whole code (on the right side in Resource Hacker) from the original chrome and paste it (replacing the original code) in your compiled script instance in resource hacker.
7. Press the compile button
8. File>Save As and name your file this time "chrome.exe"
That's it.
note: Actually you don't have to use google chrome specifically to mask your scripts, you can do it with any other .exe and you will mask it with just another name, or you could fill in the information with something entirely random.
Also i have opened a thread on Blizzard official forums asking specifically for that matter and you can track it yourself here(still waiting for Blue to give a answer):
http://us.battle.net/sc2/en/forum/topic/20743114221
So final notice: I think the chances to get you banned for this is very very low especially if you compile and mask your script. And even if blizzard can sniff something suspicious (which i highly doubt it) they will probably first warn you before perma-ban you. And after all this is only a swapping the modifiers as you would with a keyboard that has the built in functions for that... which is 100% allowed by Blizzard.
Final words: Use at your own risk.
SAFE ALTERNATIVE:
+ Show Spoiler +
If you are still concerned about the safety of your account and you still want to do this, you can use other software such as KeyTweak (download) - With this program the changes are made directly in to the registry and the downside is that you need to restart or relog your PC for the changes to take effect. (that was the killer thing that forced me to use AutoHotkey - it sucks reloging windows back and forth every time i want to play starcraft)