Writing a shellcode is often a task considerably more difficult than developing a piece of software. To me it seems your assumption about developing your program as a shellcode is incorrect and will create problems for you later on.
This kind of thing is often addressed using Packers and Crypters. There are several relatively simple ones (like UPX), while some are considered quite effective (Themida and ASPack). There are many more available packers to choose from, some are free and some are commercial.
If you are reluctant to use any of the available packers I believe researching that domain will prove more fruitful to your goal. Using a shellcode will more often require:
- Writing location independent code.
- creating your own DLL loading/locating and API resolving functionalities.
- writing or editing assembly directly.
And will however provide only little advantage over code compiled normally. For example, anti-debugging techniques (as mentioned in your comments) are not limited to "shellcode" and can just as easily be injected/written into C/C++ code. Moreover, most packers include anti-debugging tricks by default (or provide such configuration).