SQL Server 2019 running 100% on only 1-2 cores with MAXDOP 8 to 14
One row at a time is read in from flat file and converted info a format that ADO will accept to add/update into SQL Server.

You are going to have a very hard time leveraging multiple SQL Server cores with this approach.  Each single-row insert will be executed by one core, sequentially.  And each insert is very likely to keep using the same core, because each insert will be coming from the same connection.  From Microsoft SQL Server 2012 Internals by Kalen Delaney, et al:

Each SPID has a preferred scheduler, which is the one that most recently processed a request from the SPID.

If it's not a lot of trouble, you might get a &quot;quick win&quot; improvement in throughput by splitting the file into multiple files, and then having multiple instances of your C++ application loading each file concurrently.  Of course, you might run into other bottlenecks there, but it's worth a shot.
A side note: Dan Guzman mentioned:

The slowly degrading performance is symptomatic that the add/update query is performing a scan. Index/query tuning may avoid that and provide more linear and better performance overall.

If your table has additional indexes or foreign key / unique constraints, SQL Server will have to check more and more data as you load the table.  You could optimize to get seeks for these checks, or load an unindexed heap staging table first with your app, and then have an additional step that moves data to the real table using T-SQL.

Overall, to leverage more cores, you need to improve the concurrency of your loading application.  Either by using bulk loading APIs, or inserting from multiple clients concurrently. For more stable throughput, you'll need to avoid costly table scans, possibly by inserting into a staging table rather than your app table directly.