If you want to stop companies from using your freely-available software, no free or open license (i.e., FSF- or OSI-approved) will be suitable, because, as stated in the OSI definition:
The license must not restrict anyone from making use of the program in a specific field of endeavor. For example, it may not restrict the program from being used in a business...
To prevent your software from being used by a company, you'd need to come up with your own license that restricted "corporate use" or similar (you should seek qualified legal advice for this). Bear in mind also the practical issue of detecting and stopping a company that uses your freely available program.
If you want to control how companies may redistribute your program (or modified forms of it), then you're on much firmer footing -- dual licensing will serve you well. The GPL might be a perfectly suitable free license option, alongside your own proprietary licensing option: companies who opt for the GPL license could only redistribute your softwre under the GPL. If they wanted to augment your program and sell it as their own proprietary product, they would likely rather negotiate with you than be forced to place their own modifications under the GPL.
(Bear in mind that you should still seek legal advice when drafting your proprietary license. If you're interested in this, but not able to bear the legal expense up front, you might invite companies to negotiate a non-GPL license with you directly and retain legal counsel whenever a company epxresses interest.)