I have just been marking them as fixed, but they just keep coming back and I don't want to have to keep coming back to mark as fixed.
Google likes to log all of your pages at every opportunity. From this statement alone, the best way is to make your pages return a 200 status or a 410 status. A 410 means "gone" and suggests to search engines (particularly google) to stop indexing pages with the 410 status.
Google is showing about 150 of my pages as 404's but they all register as 200 all good when I do a header check. Is there another reason these may show up as 404's?
There's two cases that likely cause this:
The google bot is receiving a status 404 on the exact same page at the exact same time that others would receive status 200 on. A situation like this on a server with new webmasters suggests to me the website has been hacked. In this case, you'll need an advanced webmaster to check apache's .htaccess files for any rewrite rules that compare conditions against googlebot and google's IP addresses and remove such conditions. The same may also need to be done to any server side scripts processing the pages that visitors see. If such conditions are not removed, then eventually google may flag your website, and you will know this in webmaster tools via manual actions.
Bad timing. If you're lucky to fall in this category, then your page will return a 200 status with the exact same content regardless of what browser or IP requests it. If this is the case, then you can mark the appropriate error pages as fixed and google wont show them again unless you decide to make them non-existant before the next time google rescans the page.