Plugin or Custom Page Type

First of all, keep it in your mind that WordPress convention says theme is only for presentation and plugin is for functionality. So that means if you need to initiate any functionality you should do that in plugin and when you represent the data visually in frontend you need to do it with theme.

Now at your case you can initiate the custom post type in plugin and represent the CPT data with necessary templates(Like single.php, archive.php etc.) through theme. This way you can separate the view and business logic part.

For initiating the CPT you can use a pre-built class like the below one-
https://github.com/jjgrainger/wp-custom-post-type-class

I use this one for initiating CPT for any of my projects. You can also use it with composer.json. This class will also take care of custom taxonomy and other post type support like visual editor, default fields and so on. Read the README.md file of this class and you’ll get a full overview on how to use it with WordPress.

Hope it helps.