A few things:
1. Have you run debugging that steps through the code in BtnAdd() method where the exception occur? If you did, you would easily find out the direct cause of the exception.
2. Since you said the crash occurs in BtnAdd(), here is the cause I could guess: you should use
ribPanel = ribTab.FindPanel(PanelName) ''Which you commented out for unknown reason(s)
instead of
ribPanel = ribCntrl.FindPanel(...)
because RibbonControl.FindPanel() ONLY finds panels on ACTIVE RibbonTab! So, in your case, if the custom ribbon tab - "Design" is not the active one, the code would return a null, so the code for adding button would raise exception.
3. If I were you, I would ALWAYS test if the Tab/Panel/Button existence before adding, because it is possible that your code would handle WorkSpaceChanged event to make sure your custom ribbon tab stays when user shift between WorkSpace during the same AutoCAD session. That is, I'd have some custom ribbon generating code run on AutoCAD startup and run whenever Workspace changes, thus the rationale of testing existence before creating ribbon items.
4. As MickD correctly pointed out, in BtnAdd() method, you DO NOT declare something as "New RibbonXXX" unless you know they do not exist and you need to create them. That is, as I said, you try find out if they exist and only "New" them, when necessary.