If you want "free" caves, you can collect rocks/stones from the outside, and then glue them together with an aquarium-safe silicone to make caves out of them. But before you use the stones or rocks from the outside, you must make sure they're safe for a freshwater tank. The rocks in a freshwater tank cannot be calcareous, meaning they cannot have any
calcium in them as it will make the
pH very high. What you need are inert rocks and stones. To check if a rock/stone is inert, pour a few drops of vinegar on it, and if it "fizzles/bubbles" it means it's not good. If no reaction occurs, it's good. AND ... before you put any rocks and stones in your tank, BOIL them well to make sure any bacteria or chemicals from the outside are killed. When you boil stones/rocks, do NOT remove them from the pot immediately after boiling, because of you remove the hot rocks, they can explode! (Not kidding.) Wait until the water with the rocks cools off, then remove them.
I myself have collected rocks and stones from a river, and they're great - they even look much better than decorations from a fish store. I have read of people collecting
driftwood from nature, but I wouldn't recommend for you to do this. It's best to buy aquarium-safe driftwood from a fish store. This driftwood also needs to be soaked for many days and boiled many times before it can be put in a tank, or else you'll have your water stained brown for a VERY long time.
As for the artificial plants, I don't know how much they charge for them at your local fish store, but they're fairly cheap at my
LFS. For a 12 gallon tank, you don't really need so many artificial plants, so a few of them shouldn't be so expensive.
P.S. When you silicone anything, wait for the silicone to dry completely before putting the siliconed objects inside your tank. You should wait
at least 24 hours. I'd personally wait 48 hours just to be sure.