I try to align my assembly names with their namespaces, and use the .NET Framework itself as a guideline. I firmly believe that working with a namespace structure that drives a folder structure makes for a much more maintainable codebase.
For example, I have a caching provider that is part of the global developer framework that we use. It lives in a namespace of something similar to:
[Company].Core.Data.Caching
I have other data related functionality that also logically falls underneath the Data feature, so caching has siblings like Adapters, Converters, and Generators. So, let's assume we have the following namespaces:
[Company].Core.Data.Adapters
[Company].Core.Data.Converters
[Company].Core.Data.Caching
[Company].Core.Data.Generators
These related namespaces live in an assembly called [Company].Core.Data, which is also the project name. Finding things in the solution becomes very simple following this structure. Speaking of structure, now we get back to how they are stored on disk.
The project name is the root folder name. This assumes my source control folder, which is "C:\Source Control" on my local machine:
C:\Source Control\Core[Company].Core.Data\
C:\Source Control\Core[Company].Core.Data\Adapters
C:\Source Control\Core[Company].Core.Data\Caching
C:\Source Control\Core[Company].Core.Data\Converters
C:\Source Control\Core[Company].Core.Data\Generators
So, as a hierarchy, it looks something like:
[Solution]
--[Company].Core.Data
----[Adapters]
------(Adapters files)
----[Caching]
------(Caching files)
----[Converters]
------(Converters files)
I put all projects at the same level, and vary sub-namespaces with folders. This way the namespaces and the physical structures are easy to reconcile. The hard part is finding balance. You don't want to have a large number of smaller assemblies, so I normally will group them at a higher level, and eventually refactor it when either it is trending to grow too large, or if sub-namespaces change more frequently than other parts.
I have been doing this for years now, and it is very comfortable for not only myself, but for my developers to use.
As for your EventArgs question, I agree with the consensus that I normally do one class per file, but will make the exception to place an EventArgs class with another class if it is singular usage. For multiuse, I put them at the highest logical point in the assembly, allowing the namespace structure to bind my scoping.