Implementing our own network physical layer for fun (e.g. Ethernet) - is it too difficult? what is the suggested approach?
The other end of the wire will be connected to a standard commercial device (maybe a switch).

This was the big immediate red flag for the design. Your Arduino will be able to assert voltages of 0 and 5 volts on the wires of the Ethernet connector, at a modest frequency in the kilohertz range. A commercial switch has an Ethernet frontend, which includes magnetics and a particular serial transceiver. Your Arduino won't be able to work with the necessary voltages and frequencies that come through the magnetics (it won't be 0-5 V coming back to your microcontroller), and even with the right analog frontend you almost certainly won't meet the timings that the Ethernet hardware at the other end expects.
Now here's the good news: Arduinos have a number of I/O features, such as SPI, serial ports, etc, in addition to the directly-toggleable I/O pins. None of them will be able to talk to an Ethernet switch if you wired the pins to the Ethernet cable, but you can use them to directly connect Arduinos to each other. Of course, your off-the-shelf switch is no longer an option; this means that you may need to implement a whole &quot;ch271828n-thernet&quot; switch on an Arduino with enough I/O capabilities.
One example that comes immediately to mind is using the serial port (either of the Arduino, of a USB-serial adapter, or even of the serial port in your machine). You can come up with a physical framing layer, such as careful use of consistent overhead byte stuffing. Even better, there was a day when we did send Internet packets over a serial port -- the glorious days of dial-up where our computers would encapsulate and frame Internet packets on the serial port using a simple framing protocol known as SL/IP. As a rather simple protocol you should be able to implement it in a reasonable timeframe.