How are you doing reset when using the serial bootloader for uploading? "-c arduino" isn't going to know about the special reset pin you've provided for SPI programming, and sharing the reset signal between a serial port and your additional reset signal could be "tricky."
Your "upload once" symptom is typical of not having an auto-reset; when there is no sketch loaded, the empty memory loops back around to the bootloader, so the bootloader essentially runs continuously. When there's a sketch, the sketch runs instead and the upload operation doesn't manage to reset the board to get into the bootloader.