If you're the only one working on the project I'd do what makes sense to you first. Nothing is worse than having a directory or project structure imposed on you that you find unintuitive. Is the BaseController class in the \Core\ folder or the \Controller\ folder? Personally I'd look in the Controller but some people swear it should be in \Core\ or \Bases.
The first newbie trap is thinking that you can organize your code in the wrong way and somehow this reflects on the success of the project. I've seen projects where 30 files were in one folder and other projects where there were 20 folders for 30 files.
The second newbie trap is forgetting that compared to other languages you have the benefit of awesome intellisense, code navigation tools, and refactoring support from Visual Studio. You also have a compiler which makes misplacing a file far less painful. If you put something in the "wrong" spot, its ok, you can always find it and drag it around to where it needs to be.
I'll be honest I'm working on a project right now and I'm not even sure where certain classes reside in my file structure. Go To Definition/Declaration are keyboard shortcuts I use a lot. Because its only me working with the code this is fine. If I had to add another developer onto the project I'd probably clean things up.
Personally I tend to put Interfaces with their implementing types inside the same folder. IPaymentGateway is in the same folder as AuthorizeNetGateway and PaypalGateway. If I can't view all the files in that folder at once in my solution explorer sidebar then I move all the Gateway files into a \Gateway\ folder.
With Dependency Injection added to the mix I'd advise you to only be concerned with namespace explosions. The worst thing that you can do is clutter up your bootstrappers and files with long using declarations and aliases.
ForRequestedType<Customer>
is cleaner than
using KevDog.Models
using Customer=KevDog.Models.Customer
or
ForRequestedType<KevDog.Models.Customer>
Another way to avoid this problem is to be explicit when your naming things: Customer, CustomerViewModel, CustomerController, CustomerDataRow, CustomerView
For TDD you almost have to have two bootstrappers to manage your concrete types. You really don't want your unit tests to use AuthorizeNetGateway : IPaymentGateway, rather StubGateway : IPaymentGateway.
Now I'm also new at DI so I tend to make things very simple and mirror the 101 level tutorials and documentation. Getting into dynamic injection based on a build configuration should only be used when a specific situation requires it and you know exactly why your doing.
I usually keep the default structure for MVC apps as well. Its just easier to have your code in the same structure as 99% of all tutorials and videos.
Hope this helps.